package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.model.dto.DishDto;
import com.itheima.reggie.mapper.DishMapper;
import com.itheima.reggie.model.entity.Dish;
import com.itheima.reggie.model.entity.DishFlavor;
import com.itheima.reggie.service.DishFlavorService;
import com.itheima.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

    @Autowired
    private DishFlavorService dishFlavorService;
    /**
     * 新增菜品，同时保存对应的口味数据
     * @param dishDto
     */
    @Override
    @Transactional //涉及到多张表操作，加入事务控制注解
    public void savaWithFlavor(DishDto dishDto) {

        //保存菜品的基本信息，因为dishDto继承dish，传入dishDto会自动保存其中dish的基本信息到dish表中
        this.save(dishDto);

        //保存菜品后，dish的id自动生成了,就可以直接用dishDto.getId()来获得菜品id
        Long dishId = dishDto.getId();

        //需要在DishFlavor中给dishId赋值
        List<DishFlavor> flavors = dishDto.getFlavors();
        flavors = flavors.stream().map((item) -> {//每一个item就是一个DishFlavor实体
            item.setDishId(dishId);
            return item;
        }).collect(Collectors.toList());
//        flavors.forEach(flavor -> {flavor.setDishId(dishId);});

        //保存菜品口味信息到菜品口味表
        dishFlavorService.saveBatch(flavors);
    }

    @Override
    public void removeWithFlavor(List<Long> ids) {

        //select count(*) from dish where id in (ids) and status = 1
        LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(Dish::getId, ids);
        wrapper.eq(Dish::getStatus,1);
        int count = this.count(wrapper);

        //若count大于0，则说明有status为1的菜品，则不能删除
        if (count > 0){
            throw new CustomException("菜品正在出售中，不能删除，请先停售，再继续操作");
        }

        //若能删除，先删除dish_falvor表中菜品口味对应信息
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(DishFlavor::getDishId,ids);
        dishFlavorService.remove(queryWrapper);

        //再删除dish表中菜品信息
        this.removeByIds(ids);


        //        //由ids得到dishes
//        List<Dish> dishes = dishService.listByIds(ids);
//
//        //遍历每个dish，由菜品id得到口味信息，一个菜品可能对应多个口味
//        dishes.stream().map((item) -> {//每一个item就是一个Dish实体
//            //根据dishId得到相应的dishFlavor
//            LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
//            queryWrapper.eq(DishFlavor::getDishId,item.getId());
//            List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);
//
//            //遍历菜品的口味
//            flavors.stream().map((flavor) -> {//每一个item就是一个flavor实体
//                //删除每一个flavor
//                dishFlavorService.removeById(flavor);
//                return flavor;
//            }).collect(Collectors.toList());
//
//            //删除dish表
//            dishService.removeById(item);
//            return item;
//        }).collect(Collectors.toList());
    }

    @Override
    @Transactional //加入事务注解，保证数据一致性
    public void updateWithFlavor(DishDto dishDto) {
        ////更新dish表
        this.updateById(dishDto);

        ////更新dish_flavor表
        //1 清理当前菜品对应口味数据---dish_flavor表的delete操作
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());
        dishFlavorService.remove(queryWrapper);

        //2 添加当前提交过来的口味数据---dish_flavor表的insert操作
        List<DishFlavor> flavors = dishDto.getFlavors();
        //从前端来的dishFlavor字段没有dishId，需要给dishId赋值
        flavors = flavors.stream().map((item) -> {//每一个item就是一个DishFlavor实体
            item.setDishId(dishDto.getId());
            return item;
        }).collect(Collectors.toList());
        //保存到dish_flavor表
        dishFlavorService.saveBatch(flavors);

    }

    /**
     * 根据菜品id查询菜品信息和对应的口味信息
     * @param dishId
     * @return
     */
    @Override
    public DishDto getByIdWithFlavor(Long dishId) {
        //从dish表查询菜品基本信息，
        Dish dish = this.getById(dishId);

        //新建DishDto，并将dish的属性拷贝到dishDto中
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(dish,dishDto);

        //从dish_flavor表中查询菜品口味信息
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DishFlavor::getDishId,dishId);
        List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);



        //设置dishDto中flavors值
        dishDto.setFlavors(flavors);

        return dishDto;
    }
}
